<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*定义一个Person类*/
    function Person(_name,_age,_salary){
        //Person类的公开属性，类的公开属性的定义方式是：”this.属性名“
        this.name=_name;
        //Person类的私有属性，类的私有属性的定义方式是：”var 属性名“
        var age=_age;//私有属性
        var salary=_salary;//私有属性

        /*定义私有属性Age的对外公开访问方法*/
        this.setAge = function(intAge) {
            age = intAge;
        }
        /*定义私有属性Age的对外公开访问方法*/
        this.getAge = function() {
            return age;
        }

        //定义Person类的公开方法(特权方法)，类的公开方法的定义方式是：”this.functionName=function(){.....}“
        this.Show=function(){
            document.writeln("在公开方法里面访问类的私有属性是允许的，age="+age+"\t"+"salary="+salary);//在公开方法里面访问类的私有属性是允许的
        }
        //公共方法
        this.publicMethod = function(){
            document.writeln("在公开方法里面访问类的私有方法是允许的");
            privateFn();//在公开方法里面调用类的私有方法
            privateFn2();//在公开方法里面调用类的私有方法
        }
        /*
        定义Person类的私有方法(内部方法)，
        类的私有方法的定义方式是：”function functionName(){.....}“，
        或者 var functionName=function(){....}
        */
        function privateFn(){
            document.writeln("我是Person类的私有函数privateFn");
        }

        var privateFn2=function(){
            document.writeln("我是Person类的私有函数privateFn2");
        }
    }
    var p1 = new Person("孤傲苍狼",24,2300);
    var p2 = new Person("白虎神皇",24,2300);
    document.write("<pre>");
    document.writeln("p1 instanceof Person的结果是："+(p1 instanceof Person));//p1是Person类的实例，结果是true
    document.writeln("p2 instanceof Person的结果是："+(p2 instanceof Person));//p2是Person类的实例，结果是true
    //当==两边的内容是对象或者是对象的函数属性时，则比较内存地址是否相等
    document.writeln("当==两边的内容是对象或者是对象的函数属性时，则比较内存地址是否相等");
    document.writeln("比较p1和p2这两个对象的show方法的内存地址是否一样：p1.show== p2.show的结果是："+(p1.Show == p2.Show));//false
    document.writeln("p1.show == p2.show的结果是："+(p1.Show == p2.Show)+"，这证明p1对象和p2对象不是共享一个show方法，在内存中show方法的代码有2份，存放在两块内存区域");
    document.writeln("name是Person类定义的public属性，可以使用类的对象去直接访问类的public属性");
    document.writeln("p1.name="+p1.name);//访问公有属性，这是可以正常访问的
    document.writeln("age和salary是Person类定义的private属性，不能使用类的对象去直接访问类私有属性，这是访问不了的，结果都是undefined");
    document.writeln("p1.age="+p1.age+"，"+"p1.salary="+p1.salary)//不能使用类的对象去直接访问类私有属性，这是访问不了的，结果都是undefined
    p1.Show();//调用类的公共函数，这次允许的
    p1.publicMethod();//调用类的公共函数，这次允许的
    p1.setAge(24);//使用public方法setAge方法为私有属性age赋值
    document.writeln("使用public方法getAge方法获取私有属性age的值，p1.getAge()="+p1.getAge());//使用getAge方法获取私有属性age的值
    //document.writeln("p1.privateFn()："+p1.privateFn()+" p1.privateFn2()："+p1.privateFn2());//不能使用类的对象去调用类的私有方法，这里会报错”对象不支持此属性或者方法
    document.write("</pre>");
</script>
</body>
</html>